# ============================================================================ #
# Version: 1.0                                                                 #
# Last update: 28.11.2013                                                      #
#                                                                              #
# Makefile для проекта task3  (квантовое преобразование на MPI с шумами)       #
#                                                                              #
# !!!!!!!!!!!!!!!!!!!!!!! ВАЖНО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #
#                                                                              #
#   При первом запуске выйдет ОШИБКА при линковке в окончательный модуль!      #
#   Это особенность данной версии Makefile. просто соберите проект еще раз!    #
#                                                                              #
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #
#                                                                              #
#  если интересно в чем ошибка:                                                #
# дело в том, что откомпилированные объектные файлы сохраняются не корневой    #
# каталог, а в папку obj, но утилита make (видимо ее особенность) запоминает   #
# отсутствие файлов в корневом каталоге и потом ищет их только там (хотя опция #
# vpath %.o $(OBJ_NOW) стоит задолго до этого). В будущем исправлю             #
#                                                                              #
# Что нужно будет сделать:                                                     #
# 1. Исправить ошибку первого прохода                                          #
# ============================================================================ #


# определение имени программы
NAME = 
PROG = state

# директории
INCLUDE_DIR = include /opt/dislib
SRC_DIR     = src
LIB_DIR     = /opt/dislib

# определение всех имен через директории
SRCMODULES := $(notdir $(wildcard  $(SRC_DIR)/*.cpp))
OBJMODULES := $(SRCMODULES:.cpp=.o)
INCMODULES := $(notdir $(wildcard $(INCLUDE_DIR)/*.h) )
LIBMODULES := dislib

BIN         = bin
BIN_DEBUG   = $(BIN)/debug
BIN_RELEASE = $(BIN)/release
BIN_NOW     = $(BIN_DEBUG)

OBJ         = obj
OBJ_DEBUG   = $(OBJ)/debug
OBJ_RELEASE = $(OBJ)/release
OBJ_NOW     = $(OBJ_DEBUG)

# компиляторы
CC            = mpicxx
CFLAGSDEBUG   = -g -Wall -pedantic
CFLAGSRELEASE =
CFLAGSINCLUDE = $(addprefix -I , $(INCLUDE_DIR))
CFLAGSLIB     = $(addprefix -L , $(LIB_DIR)) $(addprefix -l, $(LIBMODULES))
CFLAGS        = $(CFLAGSDEBUG) $(CFLAGSINCLUDE) $(CFLAGSLIB) -shared

ARGUMENTS   =  -QWER a -i ./test/samples/file74 -o picture/a
NUMBER_PROC = 8
QUEUE       = test
TIME        = 5
DATE        = `date +%X`
OUTPUT      = result/$(NUMBER_PROC)-$(DATE)

# =============================================================================

# абстрактные цели
.PHONY: print clean

# пути поиска шаблонов
vpath %.h   $(INCLUDE_DIR)
vpath %.cpp $(SRC_DIR)
vpath %.o   $(OBJ_NOW)

# главная цель 
all:  $(OBJMODULES)
	$(CC) $(CFLAGS) $^ -o $(BIN_NOW)/lib$(PROG).so

# отладочная печать 
print:
	@echo $(DATE)

# шаблоны компилирования 
%.o: %.cpp %.h
	$(CC) $(CFLAGS) -c -fPIC $< -o $(OBJ_NOW)/$@

%.o: %.cpp
	$(CC) $(CFLAGS) -c -fPIC $< -o $(OBJ_NOW)/$@

# включение файла зависимостей
ifneq (clean, $(MAKECMDGOALS))
-include deps.mk
endif

# файл зависимостей
deps.mk: $(SRCMODULES)
	$(CC) -MM $^ > $@

# очистка
clean:
	rm -f $(OBJ_NOW)/*.o
	rm -f $(BIN_NOW)/lib$(PROG).so
